// #include <stdio.h>
// #include "msg_queue_peer.h"
// #include "shmem.h"



// // static struct shm_param para;

// // struct student
// // {
// //     int num;
// //     char name[64];
// // };

// // static int *total;  //指向共享内存中数据节点总个数
// // static struct student *node_arr;  //指向共享内存中节点缓存数组头

// // #define MAX_NODE 128  //最大支持学生数目
// // #define STD_NODE_LEN sizeof(struct student)
// // #define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

// // int main(int argc, char *argv[])
// // {
// //     int ret = -1;

// //     ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
// //     if(ret < 0)
// //     {
// //         return -1;
// //     }


// //     void *node_p = shm_getaddr(&para);
// //     if(node_p == NULL)
// //     {
// //         return -1;
// //     }

// //     //前4个字节存储实际的学生数目
// //     total = (int *)node_p;
// //     //后面空间存储数据点
// //     node_arr = (struct student *)(node_p + sizeof(int));

// //     printf("num = %d\n", *total);
// //     int i;
// //     for(i=0; i<*total; i++)
// //     {
// //         if(node_arr[i].num==2)
// //      { 
     
// //        printf("num=%d, name=%s\n", \
// //                node_arr[i].num,\
// //                node_arr[i].name);
// //      }
// //     }

// //     //这个接口只有在这块共享内存不用了才能删除，项目中如果一直使用，不要调用这个接口
// //     shm_del(&para);

// //     return 0;
// // }
  








// static int *total;  //指向共享内存中数据节点总个数
// static struct student *node_arr;  //指向共享内存中节点缓存数组头

// #define MAX_NODE 128  //最大支持学生数目，实际可用是127
// #define STD_NODE_LEN sizeof(struct student)
// #define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)








// #if 0
// struct msgbuf
// {
//     int mtype;
//     char mdata[256];
// };

// int main(int argc, char *argv[])
// {
//     struct msgbuf recv_buf;

//     while (1)
//     {
//         if(msg_queue_recv("topic", &recv_buf, sizeof(recv_buf), 0, 0) > 0)
//         {
//             printf("recv from msga type = %d\n", recv_buf.mtype);
//             printf("recv from msga data = %s\n", recv_buf.mdata);
//         }
//         else
//         {
//             perror("recv error:");
//             return -1;
//         }
//     }

//     return 0;
// }
// #else
// static struct shm_param para;

// struct student
// {
//     int num;
//     char name[64];
// };
// static int *total;  //指向共享内存中数据节点总个数
// static struct student *node_arr;  //指向共享内存中节点缓存数组头

// #define MAX_NODE 128  //最大支持学生数目，实际可用是127
// #define STD_NODE_LEN sizeof(struct student)
// #define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)
// int main(int argc, char *argv[])
// {
//     // int ret = -1;

//     // // 注意进程双方共享内存的大小一致
//     // ret = shm_init(&para, "shm_test", 1024);
//     // if(ret < 0)
//     // {
//     //     return -1;
//     // }

//     // struct student *addr = (struct student *)shm_getaddr(&para);
//     // if(addr == NULL)
//     // {
//     //     return -1;
//     // }

//     // printf("num = %d\n", addr->num);
//     // printf("num = %s\n", addr->name);


// int ret = -1;

//     ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
//     if(ret < 0)
//     {
//         return -1;
//     }

//     void *node_p = shm_getaddr(&para);
//     if(node_p == NULL)
//     {
//         return -1;
//     }

//     memset(node_p, 0, MAX_NODE_SIZE);

//     //前4个字节存储实际的学生数目
//     total = (int *)node_p;
//     //后面空间存储数据点
//     node_arr = (struct student *)(node_p + sizeof(int));

// printf("num= %d\n", node_arr[0].num);
// printf("name= %s\n", node_arr[0].name);
//    // 如果这个内存一直要用，那么不要删除
//    // shm_del(&para);

//     return 0;
// }
// #endif

#include "shmem.h"

static struct shm_param para;

union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

struct student
{
	char str[64]; //可以存放所有字符型
    int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

static int *total;  //指向共享内存中数据节点总个数
static struct student *node_arr;  //指向共享内存中节点缓存数组头

#define MAX_NODE 50  //最大支持学生数目
#define STD_NODE_LEN sizeof(struct student)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

int main(int argc, char *argv[])
{
    int ret = -1;

    ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
    if(ret < 0)
    {
        return -1;
    }


    void *node_p = shm_getaddr(&para);
    if(node_p == NULL)
    {
        return -1;
    }

    //前4个字节存储实际的学生数目
    total = (int *)node_p;
    //后面空间存储数据点
    node_arr = (struct student *)(node_p + sizeof(int));

    node_arr[5].new_val.i_val=33;
    node_arr[5].old_val.i_val=448;
   // node_arr[5].key=301;



// printf("num=%d, name=%s\n", \
//                 node_arr[0].num,\
//               node_arr[0].name);
    //printf("num = %d\n", *total);
  //  int i;
    // for(i=0; i<*total; i++)
    // {
    //     printf("num=%d, name=%s\n", \
    //            node_arr[i].num,\
    //            node_arr[i].name);
    // }

    //这个接口只有在这块共享内存不用了才能删除，项目中如果一直使用，不要调用这个接口
  //  shm_del(&para);

    return 0;
}
